package com.common.sms;


import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
//import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * Created by ylwh0 on 2018/5/4.
 * 阿里云交互管理
 */
public class AliyunDySmsManager {
    //验证码模板：您的验证码${code}，该验证码5分钟内有效，请勿泄漏于他人！
    static final String defaultTemplatecode = "SMS_134180264";
    static String defaultParamJsonTemplate="{\"code\":\"%s\"}";
    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";


    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    private static String accessKeyId;
    private static String accessKeySecret;
    private static String signName;

    private AliyunDySmsManager() {
        accessKeyId = "LTAINizS29OXwjuU";
        accessKeySecret = "4xpUS8hRh62DqRAcxVybirNqZTeEHy";
        signName = "挑战故事王";
    }

    private static AliyunDySmsManager aliyunDySmsAPI = new AliyunDySmsManager();

    public static AliyunDySmsManager getInstance() {
        return aliyunDySmsAPI;
    }

    public void sendSms(String phoneNumber,  String param) {
        //使用默认模板
        sendSms(phoneNumber, defaultTemplatecode, String.format(defaultParamJsonTemplate,param), null, null);
    }

    public void sendSms(String phoneNumber, String templateCode, String templateParam) {
        sendSms(phoneNumber, templateCode, templateParam, null, null);
    }

    public QuerySendDetailsResponse querySendDetails(String phoneNumber, String bizId) {
        return querySendDetails(phoneNumber, bizId, 20L, 1L);
    }

    public QuerySendDetailsResponse querySendDetails(String phoneNumber) {
        return querySendDetails(phoneNumber, null, 20L, 1L);
    }

    /**
     * @param phoneNumber     待发送手机号(必填)支持群发
     * @param templateCode    短信模板-可在短信控制台中找到(必填)
     * @param templateParam   可选:模板中的变量替换JSON串,
     *                        如模板内容为"亲爱的${name},您的验证码为${code}"时,
     *                        此处的值为"{\"name\":\"Tom\", \"code\":\"123\"}"
     * @param smsUpExtendCode 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
     * @param outId           可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
     * @return
     * @throws ClientException
     */
    public SendSmsResponse sendSms(String phoneNumber, String templateCode, String templateParam, String smsUpExtendCode, String outId) {
        SendSmsResponse sendSmsResponse = null;
        System.out.println("phoneNumber--------->"+phoneNumber);
        System.out.println("templateCode--------->"+templateCode);
        System.out.println("templateParam--------->"+templateParam);
        System.out.println("smsUpExtendCode--------->"+smsUpExtendCode);
        System.out.println("outId--------->"+outId);
        try {
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号。支持JSON格式的批量调用，批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
            //request.setPhoneNumberJson("[\"1500000000\",\"1500000001\"]");
            request.setPhoneNumbers(phoneNumber);
            //必填:短信签名-可在短信控制台中找到
            //必填:短信签名-支持不同的号码发送不同的短信签名
            //request.setSignNameJson("[\"云通信\",\"云通信\"]");
            request.setSignName(signName);
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(templateCode);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为"{\"name\":\"Tom\", \"code\":\"123\"}"
            request.setTemplateParam(templateParam);
            //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
            //request.setTemplateParamJson("[{\"name\":\"Tom\", \"code\":\"123\"},{\"name\":\"Jack\", \"code\":\"456\"}]");

            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
            //request.setSmsUpExtendCode(smsUpExtendCode);
            //可选-上行短信扩展码(扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCodeJson("[\"90997\",\"90998\"]");

            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.setOutId(outId);

            //hint 此处可能会抛出异常，注意catch
            sendSmsResponse = acsClient.getAcsResponse(request);
            if (sendSmsResponse != null && sendSmsResponse.getCode() != null) {
                //请求成功
                System.out.println("短信接口返回的数据----------------");
                System.out.println("SmsResponse---->" + sendSmsResponse.getCode());
                System.out.println("SmsResponse---->" + AliyunDySmsRespCode.getMsg(sendSmsResponse.getCode()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sendSmsResponse;
    }

    /**
     * @param phoneNumber 必填-号码
     * @param bizId       可选-流水号
     * @param PageSize
     * @param CurrentPage
     * @return
     * @throws ClientException
     */
    public QuerySendDetailsResponse querySendDetails(String phoneNumber, String bizId, long PageSize, long CurrentPage) {
        QuerySendDetailsResponse querySendDetailsResponse = null;
        try {
            //设置默认值
            PageSize = PageSize <= 0L ? 20L : PageSize;
            CurrentPage = CurrentPage <= 0L ? 1L : CurrentPage;
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象
            QuerySendDetailsRequest request = new QuerySendDetailsRequest();
            //必填-号码
            request.setPhoneNumber(phoneNumber);
            //可选-流水号
            if (bizId != null && !"".equals(bizId)) request.setBizId(bizId);
            //必填-发送日期 支持30天内记录查询，格式yyyyMMdd
            SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
            request.setSendDate(ft.format(new Date()));
            //必填-页大小
            request.setPageSize(PageSize);
            //必填-当前页码从1开始计数
            request.setCurrentPage(CurrentPage);
            //hint 此处可能会抛出异常，注意catch
            querySendDetailsResponse = acsClient.getAcsResponse(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return querySendDetailsResponse;
    }


    /**
     * 测试
     *
     * @param args
     * @throws ClientException
     * @throws InterruptedException
     */
//    public static void main(String[] args) throws InterruptedException {
//        //发短信
//        String phoneNumber = "15171415013";
//        String templateCode = defaultTemplatecode;
//        String templateParam = "{\"code\":\"1234\"}";
//        String smsUpExtendCode = "90997";
//        String outId = "yourOutId";
//        SendSmsResponse response = AliyunDySmsManager.getInstance().sendSms(phoneNumber, templateCode, templateParam, smsUpExtendCode, outId);
//        Thread.sleep(3000L);
//        System.out.println("Code=" + response.getCode());
//        System.out.println("Message=" + response.getMessage());
//        System.out.println("RequestId=" + response.getRequestId());
//        System.out.println("BizId=" + response.getBizId());
//        //查明细
//        if (response.getCode() != null && response.getCode().equals("OK")) {
//            QuerySendDetailsResponse querySendDetailsResponse = AliyunDySmsManager.getInstance().querySendDetails(response.getBizId(), null, 0L, 0L);
//            System.out.println("短信明细查询接口返回数据---------------->");
//            System.out.println("Code=" + querySendDetailsResponse.getCode());
//            System.out.println("Message=" + querySendDetailsResponse.getMessage());
//            int i = 0;
//            for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) {
//                System.out.println("SmsSendDetailDTO[" + i + "]:");
//                System.out.println("Content=" + smsSendDetailDTO.getContent());
//                System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
//                System.out.println("OutId=" + smsSendDetailDTO.getOutId());
//                System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
//                System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
//                System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
//                System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
//                System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
//            }
//            System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
//            System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
//        }
//
//    }


}
